

// 基础配置
const baseURL = 'http://localhost:30045'; // 若uni-app环境变量获取方式不同，可替换为process.env.VUE_APP_API_URL
const timeout = 50000; // 超时时间


/**
 * 封装uni-app网络请求
 * @param {Object} config 请求配置
 * @returns {Promise} 请求Promise实例
 */
function service(config) {
  // 1. 处理基础配置
  const requestConfig = {
    url: `${baseURL}${config.url || ''}`, // 拼接基础路径
    method: (config.method || 'GET').toUpperCase(), // 默认为GET，统一转为大写
    timeout,
    header: {
      'Content-Type': 'application/json',
      ...config.header // 合并用户传入的header
    },
    data: config.data || {},
    params: config.params || {}
  };

  // 2. 请求拦截器逻辑：处理token和语言头
  // 获取本地存储的token（替换原Local.get）
  const token = uni.getStorageSync('token');
  // 排除登录接口（避免循环请求）
  const isLoginApi = config.url?.toLocaleLowerCase().includes("/api/_account/loginjwt");
  if (token && !isLoginApi) {
    requestConfig.header['Authorization'] = `Bearer ${token}`;
  }

  // 设置语言头（替换原Local.get）
  const themeConfig = uni.getStorageSync('themeConfig') || {};
  requestConfig.header['Accept-Language'] = themeConfig.globalI18n || 'zh-CN';

  // 3. 处理参数序列化（对应原paramsSerializer）
  if (requestConfig.params && Object.keys(requestConfig.params).length > 0) {
    // 用qs序列化参数（支持allowDots格式）
    const serializedParams = qs.stringify(requestConfig.params, { allowDots: true });
    // GET类请求参数拼接到url
    if (['GET', 'HEAD', 'DELETE', 'OPTIONS'].includes(requestConfig.method)) {
      requestConfig.url += (requestConfig.url.includes('?') ? '&' : '?') + serializedParams;
    } else {
      // POST类请求参数作为data（根据后端需求调整，部分场景需放body）
      requestConfig.data = { ...requestConfig.data, ...requestConfig.params };
    }
  }

  // 4. 发起请求（封装为Promise）
  return new Promise((resolve, reject) => {
    uni.request({
      ...requestConfig,
      // 成功回调
      success: (response) => {
        const { statusCode, data, header } = response;

        // 处理content-disposition头（保留原逻辑）
        if (header['content-disposition']) {
          data.contentDisposition = header['content-disposition'];
        }

        // 状态码2xx视为成功（uni.request无默认状态码判断，需手动处理）
        if (statusCode >= 200 && statusCode < 300) {
          console.log(data);
          resolve(data);
        } else {
          // 非成功状态码视为错误，进入错误处理
          handleError({
            response: { status: statusCode, data, header },
            config: requestConfig
          }, reject);
        }
      },
      // 失败回调（网络错误等）
      fail: (error) => {
        handleError({
          response: error.response || { status: 0, data: null },
          config: requestConfig,
          message: error.errMsg || 'Network Error'
        }, reject);
      }
    });
  });
}


/**
 * 错误统一处理
 * @param {Object} error 错误信息
 * @param {Function} reject Promise的reject方法
 */
function handleError(error, reject) {
  const { response, message } = error;
  const status = response?.status || 0;
  const errorData = response?.data;

  // 400状态处理（参数错误等）
  if (status === 400) {
    let errorMsg = '';
    if (typeof errorData === 'string') {
      errorMsg = errorData;
    } else if (errorData) {
      if (errorData.Message && Array.isArray(errorData.Message) && errorData.Message.length > 0) {
        errorMsg = errorData.Message[0];
      } else if (errorData.Form && Object.keys(errorData.Form).length > 0) {
        const firstKey = Object.keys(errorData.Form)[0];
        errorMsg = errorData.Form[firstKey];
      }
    }
    if (errorMsg) {
      uni.showToast({ title: errorMsg, icon: 'none', duration: 3000 });
    }
    error.FormError = errorData?.Form; // 保留表单错误信息
    reject(error);
    return;
  }

  // 401/4001状态处理（未授权/ token过期）
  if (status === 401 || status === 4001) {
    uni.showModal({
      title: '',
      content: 'message._system.common.out',
      showCancel: false,
      success: () => {
        // 清除存储（替换原Session和Local）
        uni.clearStorageSync(); // 对应Session.clear()
        uni.removeStorageSync('token'); // 对应Local.remove("token")
        // 跳转首页（替换window.location.href）
        uni.reLaunch({ url: '/' });
      }
    });
    reject(error);
    return;
  }

  // 403状态处理（无权限）
  if (status === 403) {
    uni.showToast({
      title: 'message._system.common.noright',
      icon: 'none',
      duration: 3000
    });
    reject(error);
    return;
  }

  // 其他错误处理
  const defaultMsg = errorData 
    ? response.statusText || 'Request Error' 
    : 'message._system.common.requesterror';
  uni.showToast({ title: defaultMsg, icon: 'none', duration: 3000 });
  reject(error);
}


// 导出请求方法
export default service;